/***************************************************************************
 *                                 Poison.cs
 *                            -------------------
 *   begin                : May 1, 2002
 *   copyright            : (C) The RunUO Software Team
 *   email                : info@runuo.com
 *
 *   $Id: Poison.cs 511 2010-04-25 06:09:43Z mark $
 *
 ***************************************************************************/

/***************************************************************************
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 2 of the License, or
 *   (at your option) any later version.
 *
 ***************************************************************************/

using System;
using System.Collections;
using System.Collections.Generic;

namespace Server
{
    [Parsable]
    public abstract class Poison
    {
        /*public abstract TimeSpan Interval{ get; }
        public abstract TimeSpan Duration{ get; }*/
        public abstract string Name { get; }
        public abstract int Level { get; }
        public abstract Timer ConstructTimer(Mobile m);
        /*public abstract void OnDamage( Mobile m, ref object state );*/

        public override string ToString()
        {
            return this.Name;
        }


        private static List<Poison> m_Poisons = new List<Poison>();

        public static void Register(Poison reg)
        {
            string regName = reg.Name.ToLower();

            for (int i = 0; i < m_Poisons.Count; i++)
            {
                if (reg.Level == m_Poisons[i].Level)
                    throw new Exception("A poison with that level already exists.");
                else if (regName == m_Poisons[i].Name.ToLower())
                    throw new Exception("A poison with that name already exists.");
            }

            m_Poisons.Add(reg);
        }

        public static Poison Lesser { get { return GetPoison("Lesser"); } }
        public static Poison Regular { get { return GetPoison("Regular"); } }
        public static Poison Greater { get { return GetPoison("Greater"); } }
        public static Poison Deadly { get { return GetPoison("Deadly"); } }
        public static Poison Lethal { get { return GetPoison("Lethal"); } }

        #region Mondain's Legacy
        public abstract int RealLevel { get; }
        public abstract int LabelNumber { get; }

        public static Poison Parasitic { get { return GetPoison("DeadlyParasitic"); } }
        public static Poison Darkglow { get { return GetPoison("GreaterDarkglow"); } }
        #endregion

        public static List<Poison> Poisons
        {
            get
            {
                return m_Poisons;
            }
        }

        public static Poison Parse(string value)
        {
            Poison p = null;

            int plevel;

            if (int.TryParse(value, out plevel))
                p = GetPoison(plevel);

            if (p == null)
                p = GetPoison(value);

            return p;
        }

        public static Poison GetPoison(int level)
        {
            for (int i = 0; i < m_Poisons.Count; ++i)
            {
                Poison p = m_Poisons[i];

                if (p.Level == level)
                    return p;
            }

            return null;
        }

        public static Poison GetPoison(string name)
        {
            for (int i = 0; i < m_Poisons.Count; ++i)
            {
                Poison p = m_Poisons[i];

                if (Utility.InsensitiveCompare(p.Name, name) == 0)
                    return p;
            }

            return null;
        }

        public static void Serialize(Poison p, GenericWriter writer)
        {
            if (p == null)
            {
                writer.Write((byte)0);
            }
            else
            {
                writer.Write((byte)1);
                writer.Write((byte)p.Level);
            }
        }

        public static Poison Deserialize(GenericReader reader)
        {
            switch (reader.ReadByte())
            {
                case 1: return GetPoison(reader.ReadByte());
                case 2:
                    //no longer used, safe to remove?
                    reader.ReadInt();
                    reader.ReadDouble();
                    reader.ReadInt();
                    reader.ReadTimeSpan();
                    break;
            }
            return null;
        }
    }
}